/*
 * @Description: 通用方法集
 * @Date: 2022-01-17 15:02:34
 * @Author: yeming
 */
import OlStyleStyle from 'ol/style/Style' // 绘制样式，为该layer下所有的图形共用。
import OlStyleCircle from 'ol/style/Circle'
import OlStyleFill from 'ol/style/Fill'
import OlStyleStroke from 'ol/style/Stroke'
import OlStyleText from 'ol/style/Text'
import OlStyleIcon from 'ol/style/Icon'
import { setColorRgba } from '../work/common/color2rgba.js'

/**
* @desc: 随机数，设置唯一标识
* @param {Number} len 长度（返回的随机串长度）
* @param {Number} radix 基数（在多少位以内进行随机）
* @return {*}
* @use: setRandomId()
*/
export function setRandomId (len, radix) {
  var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
  var uuid = [];
  var i;
  radix = radix || chars.length;

  if (len) {
    // Compact form
    for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];
  } else {
    // rfc4122, version 4 form
    var r;

    // rfc4122 requires these characters
    uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
    uuid[14] = '4';

    // Fill in random data. At i==19 set the high bits of clock sequence as
    // per rfc4122, sec. 4.1.5
    for (i = 0; i < 36; i++) {
      if (!uuid[i]) {
        r = 0 | Math.random() * 16;
        uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
      }
    }
  }
  return uuid.join('');
}

/**
 * @desc: 设置点的通用样式
 * @param {Object} style 自定义样式 {'fillColor': 'rgba(0, 153, 255, 1)', 'strokeColor': 'rgba(255, 255, 255, 1)', 'strokeWidth': 2, 'text': 'L1'}
 */
export function setOlStylePoint (style) {
  return new OlStyleStyle({
    image: new OlStyleCircle({
      radius: 10,
      fill: new OlStyleFill({ // 填充色
        color: style.fillColor || 'rgba(0, 153, 255, 1)'
      }),
      stroke: new OlStyleStroke({ // 边框样式
        color: style.strokeColor || 'rgba(255, 255, 255, 1)',
        width: style.strokeWidth || 2
      })
    }),
    text: new OlStyleText({ // 内容文本
      text: style.text || '',
      textAlign: 'center',
      textBaseline: 'middle',
      fill: new OlStyleFill({
        color: 'white'
      })
    })
  })
}

/**
 * @desc: 设置实线的通用样式（没有填充色）
 * @param {Object} style 自定义样式 {'fillColor': 'rgba(0, 153, 255, 1)', 'strokeColor': 'rgba(255, 255, 255, 1)', 'strokeWidth': 2}
 */
export function setOlStyleSolidLine (style) {
  return new OlStyleStyle({
    stroke: new OlStyleStroke({
      color: style.fillColor || 'rgba(0, 153, 255, 1)',
      width: style.strokeWidth || 2,
      lineJoin: 'round',
      lineCap: 'round'
    })
  })
}

/**
 * @desc: 设置虚线的通用样式
 * @param {Object} style 自定义样式 {'fillColor': 'rgba(0, 153, 255, 1)', 'strokeColor': 'rgba(255, 255, 255, 1)', 'strokeWidth': 2, 'dash': [10, 20]}
 */
export function setOlStyleDashLine (style) {
  /**
   * @desc: 配置项注解
   * @param {Array} lineDash 绘制的虚线重复的最小单位，第一个数值为虚线小段长度，第二个数值为虚线间隔长度，详情参考 https://blog.csdn.net/zhongguogangkou/article/details/105637103
   * @return {*}
   * @use: 使用示例
   */
  return new OlStyleStyle({
    stroke: new OlStyleStroke({
      color: style.fillColor || 'rgba(0, 153, 255, 1)',
      width: style.strokeWidth || 2,
      lineDash: style.dash || [10, 20],
      lineJoin: 'round',
      lineCap: 'round'
    })
  })
}

/**
 * @desc: 设置圆的通用样式
 * @param {Object} style 自定义样式 {'fillColor': 'rgba(0, 153, 255, 1)', 'strokeColor': 'rgba(255, 255, 255, 1)', 'strokeWidth': 2}
 */
export function setOlStyleCircle (style) {
  return new OlStyleStyle({
    fill: new OlStyleFill({
      color: style.fillColor || 'rgba(0, 153, 255, 0.1)'
    }),
    stroke: new OlStyleStroke({
      color: style.strokeColor || 'rgba(0, 153, 255, 1)',
      width: style.strokeWidth || 2
    })
  })
}

/**
 * @desc: 设置圆没有填充色
 * @param {Object} style 自定义样式 {'fillColor': 'rgba(0, 153, 255, 1)', 'strokeColor': 'rgba(255, 255, 255, 1)', 'strokeWidth': 2}
 */
export function setOlStyleCircleNoFill (style) {
  return new OlStyleStyle({
    stroke: new OlStyleStroke({
      color: style.strokeColor || 'rgba(0, 153, 255, 1)',
      width: style.strokeWidth || 2
    })
  })
}

/**
 * @desc: 设置多边形的通用样式
 * @param {Object} style 自定义样式 {'fillColor': 'rgba(0, 153, 255, 1)', 'strokeColor': 'rgba(255, 255, 255, 1)', 'strokeWidth': 2}
 */
export function setOlStylePolygon (style) {
  return new OlStyleStyle({
    fill: new OlStyleFill({
      color: style.fillColor || 'rgba(0, 153, 255, 0.1)'
    }),
    stroke: new OlStyleStroke({
      color: style.strokeColor || 'rgba(0, 153, 255, 1)',
      width: style.strokeWidth || 2
    })
  })
}

/**
 * @desc: 设置通用图片样式
 * @param {String} image 图片链接
 * @param {Array} anchor 锚点位置
 * @param {Float} scale 缩放比例
 */
export function setOlStyleImage (image, anchor, scale) {
  return new OlStyleStyle({
    image: new OlStyleIcon({
      src: image,
      anchor: anchor || [0.5, 0.5], // 锚点位置 默认 [0.5, 0.5] 图标中心
      scale: scale || 0.5, // 缩放比例
      // size: [10, 20], // [width, height] 以像素为单位
    })
  })
}
